package com.xpec.c4.persistence;

import java.util.HashMap;
import java.util.Vector;

/**
 * 持久化策略类<br>
 * 每一个持久化策略对应一个具体的数据类
 * 
 * @author Magmaster
 * 
 */
public class Strategy
{
	/**
	 * 策略对应的目标数据类
	 */
	public String target;

	/**
	 * 策略对应的Parser
	 */
	public String parser;

	/**
	 * 是否严格排序，如果true表明存盘和读盘顺序会严格按照配置文件中的<Property />顺序进行
	 */
	public boolean isStrictOrder;

	private Vector<String> fieldOrder;

	/**
	 * 映射表：属性 -> 属性的配置
	 */
	private HashMap<String, HashMap<String, String>> mapFieldToConfig;

	public Strategy()
	{
		this.target = "";
		this.parser = "";
		this.isStrictOrder = false;

		this.mapFieldToConfig = new HashMap<String, HashMap<String, String>>();
		this.fieldOrder = new Vector<String>();
	}

	/**
	 * 给定属性名称和属性的配置关键字，获得配置内容
	 * 
	 * @param field
	 *            属性名称
	 * @param configKey
	 *            配置关键字
	 * @return 配置内容
	 */
	public String getFieldConfig(String field, String configKey)
	{
		HashMap<String, String> configs = this.mapFieldToConfig.get(field);
		if (configs == null)
			return "";
		else
			return configs.get(configKey);
	}

	/**
	 * 给定属性名称和属性的配置关键字，设置配置内容<br>
	 * 如果指定的属性名称对应的配置集不存在，则生成该属性的配置集<br>
	 * <b>如果配置xml中指定了 strict_order="yes"，则需要在调用此方法前设定 this.isStrictOrder，以保证工作正常</b>
	 * 
	 * @param field
	 *            属性名称
	 * @param configKey
	 *            配置关键字
	 * @param configValue
	 *            配置内容
	 */
	public void setFieldConfig(String field, String configKey,
			String configValue)
	{
		HashMap<String, String> configs = this.mapFieldToConfig.get(field);
		if (configs == null)
		{
			configs = new HashMap<String, String>();
			this.mapFieldToConfig.put(field, configs);
			if (this.isStrictOrder)
				this.fieldOrder.add(field);
		}

		configs.put(configKey, configValue);
	}

	/**
	 * 获得属性列表
	 * 
	 * @return 已注册的属性列表
	 */
	public String[] getFields()
	{
		String[] result;

		if (this.isStrictOrder)
		{
			Object[] objs = this.fieldOrder.toArray();

			result = new String[objs.length];
			for (int i = 0; i < result.length; i++)
				result[i] = (String) objs[i];
		}
		else
		{
			result = new String[this.mapFieldToConfig.size()];

			Object[] keys = this.mapFieldToConfig.keySet().toArray();
			for (int i = 0; i < keys.length; i++)
			{
				result[i] = (String) keys[i];
			}
		}

		return result;
	}

	/**
	 * 获取指定属性的配置关键字列表
	 * 
	 * @param field
	 *            属性名称
	 * @return 该属性的配置关键字列表，如果该属性无配置则返回null
	 */
	public String[] getConfigKeys(String field)
	{
		HashMap<String, String> config = this.mapFieldToConfig.get(field);
		if (config == null)
			return null;

		String[] result = new String[config.size()];

		Object[] keys = config.keySet().toArray();
		for (int i = 0; i < keys.length; i++)
		{
			result[i] = (String) keys[i];
		}

		return result;
	}
}
